﻿using Reserva_de_Vuelo.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.ServiceModel;
using Reserva_de_Vuelo.ReservaWS;

namespace Reserva_de_Vuelo.Controllers
{
    public class ReservaController : Controller
    {
        //
        // GET: /Reserva/

        public ActionResult Index()
        {
            ViewBag.Message = "ASP.NET MVC";

            return View();
        }
        public ActionResult Reservar(ReservaVuelo myReservaVuelo)
        {
            if (!ModelState.IsValid)
            {
                return View("~/Views/Home/Reserva.cshtml", myReservaVuelo);
            }
            else {
                try
                {
                    //1. Instanciar el objeto a ser probado prueba
                    ReservaWS.RVReservaClient proxy = new ReservaWS.RVReservaClient();

                    //CABECERA
                    ReservaWS.Reserva reserva = new ReservaWS.Reserva();

                    Reserva_de_Vuelo.VuelosService.Vuelo objVueloSeleccionado = (Reserva_de_Vuelo.VuelosService.Vuelo)Session["VUELO_SELECCIONADO"];
                    Reserva_de_Vuelo.VuelosService.HorarioVuelo objHorarioSalida = (Reserva_de_Vuelo.VuelosService.HorarioVuelo)Session["HORARIO_SALIDA"];
                    Reserva_de_Vuelo.VuelosService.HorarioVuelo objHorarioRetorno = (Reserva_de_Vuelo.VuelosService.HorarioVuelo)Session["HORARIO_RETORNO"];


                    reserva.FechaReserva = DateTime.Now; //Fecha Generacion de reserva
                    reserva.Estado = 1; //Activo
                    reserva.Comentario = myReservaVuelo.RESERVA_COMENTARIOS;
                    reserva.FechaSalida = objVueloSeleccionado.FechaSalida; //myReservaVuelo.FEC_SALIDA;
                    if (objVueloSeleccionado.FechaRetorno.HasValue)
                    {
                        reserva.FechaRegreso = objVueloSeleccionado.FechaRetorno.Value; //myReservaVuelo.FEC_REGRESO;
                    }
                    reserva.CiudadOrigen = objVueloSeleccionado.CodigoOrigen; //myReservaVuelo.CIU_ID_ORIGEN;
                    reserva.CiudadDestino = objVueloSeleccionado.CodigoDestino; //myReservaVuelo.CIU_ID_DESTINO;
                    if (objVueloSeleccionado.TipoVuelo == "RT")
                    {
                        reserva.TipoVuelo = "1"; //myReservaVuelo.VUELO_TIPO;
                    }
                    else
                    {
                        reserva.TipoVuelo = "2"; //myReservaVuelo.VUELO_TIPO;
                    }
                    reserva.MontoPago = myReservaVuelo.VUELO_MONTO_PAGO; //myReservaVuelo.VUELO_MONTO_PAGO;
                    reserva.NombreContacto = myReservaVuelo.CONTACTO_NOM;
                    reserva.ApellidoContacto = myReservaVuelo.CONTACTO_APE;
                    reserva.DireccionContacto = myReservaVuelo.CONTACTO_DIREC;
                    reserva.EmailContacto = myReservaVuelo.CONTACTO_EMAIL;
                    reserva.TelefonoContacto = myReservaVuelo.CONTACTO_TELF;
                    //reserva.CodigoReserva = "123456"; codigo generado por el servicio que devuelve al cliente

                    //DETALLE PASAJERO
                    List<ReservaWS.DetalleReservaPasajero> detallePasajero = new List<ReservaWS.DetalleReservaPasajero>();

                    if (myReservaVuelo.Pasajeros != null && myReservaVuelo.Pasajeros.Count > 0)
                    {

                        foreach (Reserva_de_Vuelo.Models.ReservaPasajero pasajeros in myReservaVuelo.Pasajeros)
                        {

                            ReservaWS.DetalleReservaPasajero pasajero = new ReservaWS.DetalleReservaPasajero();

                            pasajero.NombrePAX = pasajeros.PAX_NOM;
                            pasajero.ApellidoPaternoPAX = pasajeros.PAX_APE_PAT;
                            pasajero.FechaNacimientoPAX = DateTime.Parse(pasajeros.PAX_FEC_NAC);
                            pasajero.TipoPAX = pasajeros.PAX_TIPO;
                            pasajero.TipoDocumentoPAX = pasajeros.PAX_TIPO_DOC;
                            pasajero.NumeroDocumentoPAX = pasajeros.PAX_NUM_DOC;
                            //pasajero.PaisIDPAX = pasajeros.PAIS.PAIS_ID;
                            pasajero.PaisIDPAX = "PE";
                            pasajero.Asiento = "1";
                            pasajero.Tarifa = pasajeros.TARIFA;
                            pasajero.Impuesto = pasajeros.IMPUESTOS;
                            pasajero.FEE = pasajeros.FEE;

                            detallePasajero.Add(pasajero);

                        }

                    }

                    //DETALLE PASAJERO
                    List<ReservaWS.DetalleReservaSegmento> detalleSegmento = new List<ReservaWS.DetalleReservaSegmento>();

                    if (myReservaVuelo.Segmentos != null && myReservaVuelo.Segmentos.Count > 0)
                    {

                        foreach (Reserva_de_Vuelo.Models.SegmentoVuelo segmentos in myReservaVuelo.Segmentos)
                        {

                            ReservaWS.DetalleReservaSegmento segmento = new ReservaWS.DetalleReservaSegmento();

                            segmento.NumeroVuelo = segmentos.NroVuelo;
                            segmento.LAID = segmentos.NombreLineaAerea;
                            segmento.FechaSalida = segmentos.FechaSalida;
                            segmento.FechaLlegada = segmentos.FechaLlegada;
                            segmento.CiudadOrigenID = segmentos.CodigoOrigen;
                            segmento.CiudadDestinoID = segmentos.CodigoDestino;

                            if (segmentos.EsRetorno)
                            {
                                segmento.EsRetorno = "S";
                            }
                            else
                            {
                                segmento.EsRetorno = "N";
                            }


                            detalleSegmento.Add(segmento);

                        }

                    }

                    //AGREGAR LISTAS CON DETALLE
                    reserva.DetalleReservaPasajero = detallePasajero.ToArray();
                    reserva.DetalleReservaSegmento = detalleSegmento.ToArray();

                    Reserva_de_Vuelo.ReservaWS.PagoReserva objPagoReserva2 = new Reserva_de_Vuelo.ReservaWS.PagoReserva();
                    objPagoReserva2.NumeroTarjeta = myReservaVuelo.NroTarjeta;
                    objPagoReserva2.CVV = int.Parse(myReservaVuelo.CVVV);
                    objPagoReserva2.MesExpira = int.Parse(myReservaVuelo.MesTarjeta);
                    objPagoReserva2.AnioExpira = int.Parse(myReservaVuelo.AnioTarjeta);

                    objPagoReserva2.MontoReserva = reserva.MontoPago;
                    reserva.PagoReserva = objPagoReserva2;

                    //2. Invocar al metodo de la prueba
                    ReservaWS.Reserva objetoResultado = proxy.GrabarReserva(reserva);

                    //EVALUAR OBJETO RESULTADO objetoResultado.MensajeNoOK
                    myReservaVuelo.RESERVA_CODIGO = objetoResultado.CodigoReserva;
                    ViewBag.CodigoPago = objetoResultado.CodigoPago;

                    return View("~/Views/Home/Reservado.cshtml", myReservaVuelo);
                }
                catch (FaultException<ValidationException> ex)           
                {
                    //Enviar error del FaultException
                    ViewBag.Error = ex.Detail.ValidationError;
                    return View("~/Views/Home/Reserva.cshtml", myReservaVuelo);
                }
            }
        }
    }
}
